// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
import org.apache.ibatis.logging.stdout.StdOutImpl;
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        List<Integer>[] g = new ArrayList[n];
        Arrays.setAll(g, e->new ArrayList<>());
        for(int i = 0; i < n - 1; i++){
            int x = in.nextInt() - 1, y = in.nextInt() - 1;
            g[x].add(y);
            g[y].add(x);
        }
        int[] a = new int[n];
        for(int i = 0; i < n; i++){
            a[i] = in.nextInt();
        }
        dis = new int[n];//0->i;
        sum = new long[n];
        ans = 0;
        dfs(0, -1, g, a);
        reroot(0, -1, g, ans);
        System.out.println(ans);
    }
    static int[] dis;
    static long[] sum;
    static long ans = 0;
    static void dfs(int x, int fa, List<Integer>[] g, int[] a){
        ans += (long)dis[x] * a[x];
        sum[x] = a[x];
        for(int y : g[x]){
            if(y == fa) continue;
            dis[y] = dis[x] + 1;
            dfs(y, x, g, a);
            sum[x] += sum[y];
        }
    }
    static void reroot(int x, int fa, List<Integer>[] g, long res){
        for(int y : g[x]){
            if(y == fa) continue;
            reroot(y, x, g, res + (sum[0]-sum[y]-sum[y]));
            ans = Math.min(ans, res+(sum[0]-sum[y]-sum[y]));
        }
    }
}
//import java.util.*;
//public class Main{
//    public static void main(String[] args){
//        Scanner in = new Scanner(System.in);
//        String[] s = in.nextLine().split(" ");
//        char[] ch = s[0].toCharArray();
//        int k = Integer.parseInt(s[1]);
//        int n = ch.length;
//        memo = new long[n][17];
//        for(long[] r : memo) Arrays.fill(r, -1);
//        long res = dfs(0, 0, k, true, ch);
//        System.out.println(res);
//    }
//    private final static int mod = (int)1e9 + 7;
//    static long[][] memo;
//    static long dfs(int i, int j, int k, boolean isLimit, char[] s){
//        int bit = Integer.bitCount(j);
//        if(i == s.length) return bit == k ? 1 : 0;
//        if(!isLimit && memo[i][bit] != -1) return memo[i][bit];
//        int x = Character.isDigit(s[i]) ? s[i] - '0' : (s[i] - 'A') + 10;
//        int up = isLimit ? x : 15;
//        long res = 0;
//        for(int d = 0; d <= up; d++){
//            int t = j | 1 << d;
//            if(d == 0 && Integer.bitCount(t) == 1) t = 0;
//            if(Integer.bitCount(t) > k) continue;
//            res = (res + dfs(i+1, t, k, isLimit && d==up, s)) % mod;
//        }
//        if(!isLimit) memo[i][bit] = res;
//        return res;
//    }
//}
//f[1] = 1 = C11 * 2^1
//f[2] = f[1] + Cn2 * 2^2 = Cn1 + Cn2 * (C20+...+C22)
//f[3] = f[2] + = Cn1 + Cn2 * 2^2 + Cn3 * 2^3
//
//import java.util.*;
//public class Main{
//    public static void main(String[] args){
//        Scanner in = new Scanner(System.in);
//        int n = in.nextInt();
//        long k = in.nextLong();
//        int[] cnt = new int[64];
//        for(int i = 0; i < n; i++){
//            long x = in.nextLong();
//            for(int j=0; j<64; j++){
//                cnt[j] += (int)(x >> j & 1);
//            }
//        }
//        memo = new long[64][2];
//        for(long[] r : memo)
//            Arrays.fill(r, -1L);
//        long ans = dfs(63, 0, true, cnt, k, n);
//        System.out.println(ans);
//    }
//    static long[][] memo;
//    static long dfs(int i, int j, boolean isLimit, int[] cnt, long k, int n){
//        if(i < 0) return 0;
//        if(!isLimit && memo[i][j] != -1) return memo[i][j];
//        long res = 0;
//        int up = isLimit ? (int)(k>>i)&1 : 1;
//        for(int d=0; d <= up; d++) {
//            long t = (d == 0 ? cnt[i] : n - cnt[i]) * (1L << i);
//            res = Math.max(res, dfs(i - 1, d, isLimit && d==up,cnt, k, n) + t);
//        }
//        if(!isLimit) memo[i][j] = res;
//        return res;
//    }
//}
//import java.util.*;
//public class Main {
//    static long ans = 0;
//    public static void main(String[] args) {
//        Scanner in = new Scanner(System.in);
//        int t = in.nextInt();
//        while (t-- > 0) {
//            int n = in.nextInt();
//            ans = 0;
//            TreeMap<Integer, List<Integer>> a = new TreeMap<>();
//            TreeMap<Integer, List<Integer>> b = new TreeMap<>();
//            for (int i = 0; i < n; i++) {
//                int k = in.nextInt(), l = in.nextInt(), r = in.nextInt();
//                if(l > r){
//                    ans += r;
//                    a.computeIfAbsent(k, e -> new ArrayList<>()).add(l-r);
//                }else{
//                    ans += l;
//                    b.computeIfAbsent(n-k, e -> new ArrayList<>()).add(r-l);
//                }
//            }
//            f(a);
//            f(b);
//            System.out.println(ans);
//        }
//    }
//    static void f(Map<Integer, List<Integer>> map){
//        PriorityQueue<Integer> que = new PriorityQueue<>();
//        for(int k : map.keySet()){
//            List<Integer> lst = map.get(k);
//            for(int d : lst){
//                ans += d;
//                que.offer(d);
//                if(que.size() > k){
//                    ans -= que.poll();
//                }
//            }
//        }
//    }
//}
//import java.util.*;
//public class Main{
//    public static void main(String[] args){
//        Scanner in = new Scanner(System.in);
//        int n = in.nextInt() - 1, k = in.nextInt();
//        List<Integer>[] g = new ArrayList[n+1];
//        Arrays.setAll(g, e->new ArrayList<>());
//        for(int i=0; i<n; i++){
//            int x = in.nextInt()-1, y = in.nextInt()-1;
//            g[x].add(y);
//            g[y].add(x);
//        }
//        ans = k;
//        dfs(0, -1, g, 1, k);
//        System.out.println(ans);
//    }
//    static long ans;
//    static final int MOD = (int)1e9 + 7;
//    static void dfs(int x, int fa, List<Integer>[] g, int depth, int k){
//        int cnt = 0;
//        for(int y : g[x]){
//            if(y == fa) continue;
//            ans = ans * (k - (depth > 1 ? 2 : depth) - cnt) % MOD;
//            dfs(y, x, g, depth+1, k);
//            cnt++;
//        }
//    }
//}
//import java.util.*;
//public class Main{
//    static class Fenwick{
//        int[] tree;
//        int mod;
//        public Fenwick(int mod, int[] nums){
//            this.mod = mod;
//            int n = nums.length;
//            tree = new int[n<<2];
//            build(1, 0, n-1, nums);
//        }
//        void build(int i, int l, int r, int[] a){
//            if(l == r){
//                tree[i] = a[l] % mod;
//                return;
//            }
//            int mid = (l + r) / 2;
//            build(i<<1, l, mid, a);
//            build(i<<1|1, mid+1, r, a);
//            tree[i] = tree[i<<1] * tree[i<<1|1] % mod;
//        }
//        int query(int i, int l, int r, int L, int R){
//            if(L <= l && r <= R){
//                return tree[i];
//            }
//            int mid = (l + r) >>> 1;
//            if(L > mid){
//                return query(i<<1|1, mid+1, r, L, R);
//            }
//            if(R <= mid){
//                return query(i<<1, l, mid, L, R);
//            }
//            return query(i<<1, l, mid, L, R) * query(i<<1|1,mid+1, r, L, R) % mod;
//        }
//    }
//    public static void main(String[] args){
//        Scanner in = new Scanner(System.in);
//        int t = in.nextInt();
//        while(t-- > 0){
//            int n = in.nextInt(), mod = in.nextInt();
//            int[] a = new int[n];
//            for(int i=0; i<n; i++){
//                a[i] = in.nextInt();
//            }
//            in.nextLine();
//            Fenwick tree = new Fenwick(mod, a);
//            char[] c = in.nextLine().toCharArray();
//            int l = 0, r = n-1;
//            for(char ch : c){
//                System.out.print(tree.query(1, 0, n-1, l, r) + " ");
//                if(ch == 'L') l++;
//                else r--;
//            }
//            System.out.println();
//        }
//    }
//}